package com.woniuxy.patrol.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniuxy.patrol.dto.PatrolStatsDTO;
import com.woniuxy.patrol.pojo.PatrolPointRecord;
import com.woniuxy.patrol.service.PatrolRecordService;
import com.woniuxy.patrol.mapper.PatrolPointRecordMapper;
import com.woniuxy.common.utils.ResponseUtil;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
* @author 13162
* @description 针对表【wcm_patrol_point_record(点位巡更记录表)】的数据库操作Service实现
* @createDate 2025-07-14 19:22:37
*/
@Service
public class PatrolRecordServiceImpl extends ServiceImpl<PatrolPointRecordMapper, PatrolPointRecord>
    implements PatrolRecordService{

    @Resource
    private PatrolPointRecordMapper recordMapper;

    @Override
    public ResponseUtil submitRecord(PatrolPointRecord record) {
        // 对应《巡更demo.docx》中巡更人员签到提交记录的功能
        record.setStatus(1); // 已打卡状态（固定值）
        record.setPatrolTime(new Date()); // 签到时间（后端生成）
        record.setCreateTime(new Date()); // 创建时间（后端生成）
        record.setUpdateTime(new Date()); // 更新时间（后端生成）
        record.setIsDelete(1); // 未删除状态（固定值）
        // 确保photoUrls字段被保存（即使为空字符串）
        // PatrolRecordServiceImpl 的 submitRecord 方法
        record.setCreateBy(record.getCreateBy()); // 假设用 Spring Security 获取当前用户
        record.setPhotoUrls(record.getPhotoUrls());// 添加图片URL
//        if (record.getPhotoUrls() == null) {
//            record.setPhotoUrls("");
//        }
//        record.setStatus(1); // 标记为已打卡
//        record.setPointName(record.getPointName());// 添加点位名称
//        record.setTaskId(record.getTaskId());// 添加任务ID
//        record.setPatrolTime(new Date());// 添加签到时间
//        record.setCategoryId(record.getCategoryId());// 添加点位类别ID
//        record.setCategoryName(record.getCategoryName());// 添加点位类别名称
//        record.setPatrolResult(record.getPatrolResult());// 添加巡更结果

//        record.setRemark(record.getRemark());// 添加备注
//        record.setAreaName(record.getAreaName());// 添加区域名称
//        record.setLongitude(record.getLongitude());// 添加经度
//        record.setLatitude(record.getLatitude());// 添加纬度
//        record.setCreateBy(record.getCreateBy());// 添加创建人
//        record.setUpdateBy(record.getUpdateBy());// 添加更新人
//        record.setIsDelete(1);
//        record.setCreateTime(new Date());
//        record.setUpdateTime(new Date());
        save(record);
        return ResponseUtil.success("巡更记录提交成功");
    }

    @Override
    public ResponseUtil getByTaskId(Long taskId) {
        List<PatrolPointRecord> records = recordMapper.selectByTaskId(taskId);
        return ResponseUtil.success(records);
    }

    @Override
    public ResponseUtil getByPointId(Long pointId) {
        List<PatrolPointRecord> records = recordMapper.selectByPointId(pointId);
        return ResponseUtil.success(records);
    }

    @Override
    public ResponseUtil getAll() {
        List<PatrolPointRecord> records = recordMapper.selectList(null);
        return ResponseUtil.success(records);
    }
    // 新增：按社区查询记录（带分页和时间筛选）
    @Override
    public Page<PatrolPointRecord> getByCommunity(Long communityId, String startTime, String endTime, Integer pageNum, Integer pageSize) {

        Page<PatrolPointRecord> page = new Page<>(pageNum, pageSize);

        // 如果wcm_patrol_point_record表中有community_id字段，直接查询：
        QueryWrapper<PatrolPointRecord> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("community_id", communityId) // 直接关联社区ID
                .eq("is_delete", 1); // 只查未删除的记录

        // 如果表中没有community_id，需要通过point_id关联wcm_patrol_point表查询：
        // 此时需要在mapper中写XML关联查询，示例：
        // return recordMapper.selectByCommunity(page, communityId, startTime, endTime);

        // 时间筛选（按签到时间patrol_time）
        if (startTime != null && !startTime.isEmpty()) {
            queryWrapper.ge("patrol_time", startTime);
        }
        if (endTime != null && !endTime.isEmpty()) {
            queryWrapper.le("patrol_time", endTime);
        }

        // 按签到时间倒序（最新的记录在前面）
        queryWrapper.orderByDesc("patrol_time");

        // 执行查询（MyBatis-Plus会自动查询wcm_patrol_point_record表）
        return recordMapper.selectByCommunity(page, communityId, startTime, endTime);
    }

    // 新增：导出记录（实际项目中需实现Excel导出逻辑）
//    @Override
//    public String exportByCommunity(Long communityId, String startTime, String endTime) {
//        // 1. 查询符合条件的记录（复用上面的查询逻辑）
//        // 2. 生成Excel文件并上传到MinIO
//        // 3. 返回文件访问URL
//        return "http://your-minio-url/export/巡更记录.xlsx"; // 示例URL
//    }



    // 统计数据实现
    @Override
    public PatrolStatsDTO selectPatrolStats(Long communityId) {
        try {
            // 1. 查询基本统计数据（原有逻辑）
            PatrolStatsDTO stats = recordMapper.selectPatrolStats(communityId);
            if (stats == null) {
                stats = new PatrolStatsDTO(); // 避免空指针
            }

            // 2. 新增：查询异常类型分布（remark字段统计结果）
            List<Map<String, Object>> exceptionTypes = recordMapper.selectExceptionTypeDistribution(communityId);
            stats.setExceptionTypes(exceptionTypes); // 设置到DTO中

            return stats;
        } catch (Exception e) {
            log.error("获取统计数据异常", e);
            return null;
        }
    }

    // 新增：最近异常记录实现
    @Override
    public ResponseUtil getRecentExceptions(Long communityId, Integer limit) {
        try {
            Page<PatrolPointRecord> page = recordMapper.selectRecentExceptions(
                    new Page<>(1, limit),  // 取第1页，limit条数据
                    communityId,
                    limit
            );
            return ResponseUtil.success(page.getRecords());
        } catch (Exception e) {
            log.error("获取最近异常记录异常", e);
            return ResponseUtil.error("系统异常，获取异常记录失败");
        }
    }


    /**
     * 导出记录 Excel
     *
     * @param communityId 社区ID
     * @param startTime   开始时间
     * @param endTime     结束时间
     * @return ByteArrayOutputStream
     */
    @Override
    public ByteArrayOutputStream exportRecords(Long communityId, String startTime, String endTime) {
        // 通过关联查询获取符合条件的巡更记录
        List<PatrolPointRecord> records = recordMapper.selectByCommunityWithPoint(communityId, startTime, endTime);

        XSSFWorkbook workbook = new XSSFWorkbook();
        XSSFSheet sheet = workbook.createSheet("巡更记录");

        // 表头
        String[] headers = {"巡更点位", "点位分类", "地区名称", "签到时间", "签到人员", "巡检结果", "异常说明"};
        XSSFRow headerRow = sheet.createRow(0);
        for (int i = 0; i < headers.length; i++) {
            headerRow.createCell(i).setCellValue(headers[i]);
        }

        // 写入数据（注意：补充位置编号的获取，若record中没有则可能需要关联其他表）
        for (int i = 0; i < records.size(); i++) {
            PatrolPointRecord record = records.get(i);
            XSSFRow row = sheet.createRow(i + 1);
            row.createCell(0).setCellValue(record.getPointName() != null ? record.getPointName() : "");
            row.createCell(1).setCellValue(record.getCategoryName() != null ? record.getCategoryName() : "");
            row.createCell(2).setCellValue(record.getAreaName() != null ? record.getAreaName() : ""); // 假设存在areaName字段

            // 日期格式化
            if (record.getPatrolTime() != null) {
                row.createCell(3).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(record.getPatrolTime()));
            } else {
                row.createCell(3).setCellValue("");
            }

            row.createCell(4).setCellValue(record.getCreateBy() != null ? record.getCreateBy() : "");
            row.createCell(5).setCellValue(record.getPatrolResult() != null ? record.getPatrolResult() : "");
            row.createCell(6).setCellValue(record.getRemark() != null ? record.getRemark() : "");
        }

        // 调整列宽
        for (int i = 0; i < headers.length; i++) {
            sheet.autoSizeColumn(i);
        }

        // 写入字节流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            workbook.write(outputStream);
            workbook.close();
        } catch (IOException e) {
            log.error("导出Excel失败", e);
            throw new RuntimeException("导出巡更记录失败", e);
        }
        return outputStream;
    }

    // PatrolRecordServiceImpl.java
    @Override
    public ResponseUtil getStats(Long communityId) {
        try {
            PatrolStatsDTO stats = selectPatrolStats(communityId);
            if (stats != null) {
                return ResponseUtil.success(stats);
            } else {
                return ResponseUtil.error("获取统计数据失败");
            }
        } catch (Exception e) {
            log.error("获取统计数据异常", e);
            return ResponseUtil.error("获取统计数据异常");
        }
    }
}